// 给定正整数 n，找到若干个完全平方数（比如 1, 4, 9, 16, ...）使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

// 给你一个整数 n ，返回和为 n 的完全平方数的 最少数量 。

// 完全平方数 是一个整数，其值等于另一个整数的平方；换句话说，其值等于一个整数自乘的积。例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/perfect-squares
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<set>
#include<queue>
using namespace std;

// 看了题解，动态规划

// 执行用时：
// 172 ms
// , 在所有 C++ 提交中击败了
// 55.60%
// 的用户
// 内存消耗：
// 8.8 MB
// , 在所有 C++ 提交中击败了
// 73.09%
// 的用户

class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n+1,0);
        dp[0]=0;
        dp[1]=1;
        for(int i=2;i<n+1;i++){
            int s=sqrt(i);
            int p=s*s;
            if(i==p){
                dp[i] = 1;
                continue;
            }
            dp[i] = 1+dp[i-p];
            for(int j = s-1;j>0;j--){
                dp[i] = min(dp[i],1+dp[i-j*j]);
            }
        }
        return dp[n];
    }
};